home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / MCommands_1_0.lha / Src / for.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-19  |  4.0 KB  |  196 lines

  1. #define __USE_SYSBASE
  2.  
  3. #include <exec/types.h>
  4. #include <exec/execbase.h>
  5. #include <exec/memory.h>
  6. #include <dos/rdargs.h>
  7. #include <dos/dosasl.h>
  8. #include <dos/dosextens.h>
  9. #include <dos/dostags.h>
  10. #include <utility/tagitem.h>
  11. #include <support/types.h>
  12. #include <support/exec.h>
  13.  
  14. #include <string.h>
  15.  
  16. #include <proto/exec.h>
  17. #include <proto/dos.h>
  18.  
  19. #include "for.rev.h"
  20.  
  21. #define DOS_NAME        "dos.library"
  22. #define DOS_VERN         37L
  23.  
  24. #define TEMPLATE        "FILE/A,COMMAND/F,ALL/S"
  25.  
  26. #define DEF_COMM        "%S"
  27.  
  28. STATIC CONST TEXT VersionString[]=
  29.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  30.  
  31. #define OPT_FILE        0
  32. #define OPT_COMM        1
  33. #define OPT_ALL            2
  34. #define OPT_COUNT        3
  35.  
  36. #define NAME_SIZE        32            /* File's name */
  37. #define BUFF_SIZE        1024        /* Expanded command */
  38. #define PATH_SIZE        256            /* For file's path */
  39.  
  40. STATIC BOOL SPrintf(STRPTR format, STRPTR buffer, ULONG buffSize,
  41.                                         STRPTR name, STRPTR path);
  42.  
  43. ULONG For(VOID)
  44. {
  45.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  46.     struct DosLibrary *DOSBase;
  47.  
  48.     STATIC CONST struct TagItem CommandTags[]=
  49.     {
  50.         {SYS_UserShell,TRUE},
  51.         {TAG_DONE,0}
  52.     };
  53.  
  54.     struct RDArgs *Args;
  55.     struct AnchorPath *Anchor;
  56.     LONG Opts[OPT_COUNT];
  57.     ULONG TempRC,RC=RETURN_FAIL;
  58.     CHAR FName[NAME_SIZE];
  59.     STRPTR CommBuffer;
  60.     BPTR CurrLock,OldLock;
  61.     BOOL ErrOccured=FALSE;
  62.  
  63.     unless(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN))
  64.     {
  65.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  66.         goto InvalidDOS;
  67.     }
  68.  
  69.     unless(Anchor=AllocVec(sizeof(struct AnchorPath)+PATH_SIZE,MEMF_CLEAR))
  70.     {
  71.         PrintFault(IoErr(),NULL);                                /* Inform user */
  72.         goto NoMemory1;
  73.     }
  74.     Anchor->ap_BreakBits=SIGBREAKF_CTRL_C;        /* Allow break */
  75.     Anchor->ap_Strlen=PATH_SIZE;
  76.  
  77.     unless(CommBuffer=AllocVec(BUFF_SIZE,MEMF_CLEAR))
  78.     {
  79.         PrintFault(IoErr(),NULL);                                /* Inform user */
  80.         goto NoMemory2;
  81.     }
  82.  
  83.     clear(&Opts);
  84.     unless(Args=ReadArgs(TEMPLATE,Opts,NULL))
  85.     {
  86.         PrintFault(IoErr(),NULL);                                /* Inform user */
  87.         goto NoArgs;
  88.     }
  89.     unless(Opts[OPT_COMM])
  90.         Opts[OPT_COMM]=(ULONG)DEF_COMM;
  91.  
  92.     TempRC=MatchFirst((STRPTR)Opts[OPT_FILE],Anchor);
  93.     while(TempRC==0)
  94.     {
  95.         strcpy(FName,Anchor->ap_Info.fib_FileName);
  96.         if(Anchor->ap_Info.fib_DirEntryType>=0)
  97.         {
  98.             if(Opts[OPT_ALL])
  99.             {
  100.                 if(!ftst(Anchor->ap_Flags,APF_DIDDIR))
  101.                     fset(Anchor->ap_Flags,APF_DODIR);
  102.                 fclr(Anchor->ap_Flags,APF_DIDDIR);
  103.             }
  104.             goto Next;    
  105.         }
  106.         CurrLock=DupLock(Anchor->ap_Current->an_Lock);
  107.         OldLock=CurrentDir(CurrLock);
  108.         if(SPrintf((STRPTR)Opts[OPT_COMM],CommBuffer,BUFF_SIZE,
  109.                                 FName,Anchor->ap_Buf))
  110.         {
  111.             if(System(CommBuffer,CommandTags))    /* An error */
  112.             {
  113.                 PrintFault(IoErr(),NULL);
  114.                 ErrOccured=TRUE;
  115.             }
  116.         }
  117.         else
  118.         {
  119.             PrintFault(ERROR_LINE_TOO_LONG,NULL);
  120.             SetIoErr(ERROR_LINE_TOO_LONG);
  121.             ErrOccured=TRUE;
  122.         }
  123.         CurrentDir(OldLock);
  124.         UnLock(CurrLock);
  125. Next:
  126.         TempRC=MatchNext(Anchor);
  127.     }
  128.     if(TempRC==ERROR_NO_MORE_ENTRIES)
  129.         RC=(ErrOccured ? RETURN_ERROR : RETURN_OK);
  130.     else
  131.     {
  132.         PrintFault(TempRC,NULL);
  133.         RC=(TempRC==ERROR_BREAK ? RETURN_WARN : RETURN_FAIL);
  134.     }
  135.     MatchEnd(Anchor);
  136.  
  137.     FreeArgs(Args);
  138. NoArgs:
  139.     FreeVec(CommBuffer);
  140. NoMemory2:
  141.     FreeVec(Anchor);
  142. NoMemory1:
  143.     CloseLibrary((struct Library *)DOSBase);
  144. InvalidDOS:
  145.     return(RC);
  146. }
  147.  
  148. STATIC BOOL SPrintf(STRPTR format, STRPTR buffer, ULONG buffSize,
  149.                                         STRPTR name, STRPTR path)
  150. {
  151.     ULONG NameLen=strlen(name),PathLen=strlen(path),Len;
  152.     CHAR CurrChar;
  153.     STRPTR Arg,HighBuffer=buffer+buffSize-1;
  154.  
  155.     memset(buffer,0,buffSize);        /* Clear buffer */
  156.     while(CurrChar=*format++)
  157.     {
  158.         if(buffer<HighBuffer)                /* The char will fit */
  159.             *buffer=CurrChar;
  160.         else
  161.             return(FALSE);
  162.  
  163.         if(CurrChar=='%')
  164.         {
  165.             switch(*format)
  166.             {
  167.                 case 's':
  168.                 case 'S':
  169.                     Len=NameLen;
  170.                     Arg=name;
  171.                     break;
  172.                 case 'p':
  173.                 case 'P':
  174.                     Len=PathLen;
  175.                     Arg=path;
  176.                     break;
  177.                 default:
  178.                     goto NextChar;
  179.             }
  180.             if(buffer+Len+2<HighBuffer)
  181.             {
  182.                 *buffer++='"';
  183.                 strcpy(buffer,Arg);            /* Insert arg */
  184.                 buffer+=Len;                        /* Update dest */
  185.                 *buffer='"';
  186.                 format++;                                /* Skip control char */
  187.             }
  188.             else
  189.                 return(FALSE);
  190.         }
  191. NextChar:
  192.         buffer++;
  193.     }
  194.     return(TRUE);
  195. }
  196.